package van.planifolia.work1;

import van.planifolia.ListConstant;
import van.planifolia.People;

import java.util.*;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * Created by Intellij IDEA<br>
 *
 * @author Planifolia.Van
 * @version 1.0
 * @date 2022/11/6 16:04
 */
public class Collect {
    public static void main(String[] args) {
        /* 搜集方法这个方法可以说是Stream流操作中的大头方法了，主要是是依赖于Collections工具类
            中的方法来进行一系列操作，大致可以分为两类分别是对集合中的元素进行运算操作，以及对流的搜集操作(转化为一个新的集合，
            比如 Set，Map，List)等
         */
        // 首先我们就来先展示一下其中的对集合元素进行的操作
        // 比如这个 根据数组中的人们国家进行分组，显然我们在collect中调用了Collectors的分组方法并且根据国家进行分组即得到了分组好的map
        Map<String, List<People>> collect = ListConstant.peoples.stream().collect(Collectors.groupingBy(People::getAddress));
        collect.forEach((s, people) -> {
            System.out.println("国家"+s);
            System.out.println(people);
        });
        // 像这个方法就会根据我们给他的值来计算出平均值
        Double collect1 = ListConstant.peoples.stream().collect(Collectors.averagingInt(People::getAge));
        System.out.println(collect1);
        // 当然这里也有求最值的一系列方法，根据一些条件求最大最小值，其实我们并没有必要使用这个方法因为idea也会提醒我们可以替换为max就行了
        System.out.println(ListConstant.peoples.stream().collect(Collectors.maxBy(Comparator.comparingInt(People::getAge))));
        // 这里也是没必要用summingInt可以使用mapToInt中的sum方法也是一样的效果
        System.out.println(ListConstant.peoples.stream().collect(Collectors.summingInt(People::getAge)));
        System.out.println((Integer) ListConstant.peoples.stream().mapToInt(People::getAge).sum());
        // 最后剩下的就是讲流转变成另外一种集合了,其实这里转变为map确实 有点难懂，不过我们仔细看一下也就能发现，他这个toMap方法是要两个参数，
        // 两个计算型接口分别作为Map的key与Value所以我们就吧people的名字作为key，people对象作为value
        Map<String, People> collect2 = ListConstant.peoples.stream().collect(Collectors.toMap(People::getName, people -> people));
        System.out.println(collect2);
        // 转换为set，List都是一个套路没啥好说的,当然idea也会感觉我们这样的操作十分的冗余推荐我们直接换成List Set  的构造方法
        System.out.println(new HashSet<>(ListConstant.peoples));
        System.out.println(new ArrayList<>(ListConstant.peoples));

        System.out.println(ListConstant.peoples.stream().collect(Collectors.toSet()));
        System.out.println(ListConstant.peoples.stream().collect(Collectors.toList()));
    }
}
